﻿/**
 * 通用js，包含最基础、最常用的操作 如：打日志、日期处理、mobile平台的兼容处理等等
 * 这里的操作不依赖于任何第三方库
 */
(function(exports) {
    "use strict";

    var appVersion = navigator.appVersion.toLocaleLowerCase(),
   
        ua = navigator.userAgent;

    var APP_DOWNLOAD_URL_IOS_WX = "http://a.app.qq.com/o/simple.jsp?pkgname=com.lphtsccft",
        APP_DOWNLOAD_URL = "https://m.zhangle.com/cft/download.html";

    var base = {

        LOG_ON: true,

        /**
         * 打印日志，当日志开关为打开时，才写日志
         */
        log: function(message) {
            if (this.LOG_ON) {
                console.log(message);
            }
        },

        /**
         * 打印错误日志   
         */
        e: function(message) {
            if (this.LOG_ON) {
                console.error(message);
            }
        },

        /**
         * override各平台的 href，对win/android特殊处理
         */
        href: function(url) {
            if (appVersion.indexOf("windows phone") > 0) {
                window.external.notify(url);
            } else if (appVersion.indexOf("android") > 0) {
                window.MyWebView.onJsOverrideUrlLoading(url);
            } else if (this.isIOS()) {
                // 由于iOS10及以后的webkit内核，对http://xxx:80013 这类URL解析时，若port字段大于65536，则会跳转出错
                // 涨乐iOSAPP自4.5.0版本起，增加了对这种情况的特殊处理
                this.isAccessVersion('4.5.0',function(allowed){
                    if(allowed) {
                        window.HTMsgRouter.hrefWithMsgUrl(url);         
                    } else {
                        window.location.href = url;
                    }
                })                
            } else {                
                // use the default href for iphone, PC and others.
                window.location.href = url;
            }
        },

        /**
         * 设置手机客户端页面标题，仅支持版本5.0（包括）以上
         * onUpdateTitleAndSubTitle(titile, subTitle) ，网页可以主动调用该方法设置标题，
         * version当前客户端版本。titile(主标题)和subTitle(副标题)支持传空字符串，若传空则导航栏不显示对应的标题
         */
        setWebTitle: function(version,titile,subTitle){
            if(this.versionCompare(version,"5.0.0") >= 0) {
                if (this.isAndroid()) {
                    window.MyWebView.onUpdateTitleAndSubTitle(titile,subTitle);
                } else {
                    onUpdateTitleAndSubTitle(titile,subTitle);
                }
            }
        },

        /**
         * 对于Android平台，需要调用Android定义的函数
         */
        goBackUrl: function(url) {
            if (appVersion.indexOf("android") > 0) {
                window.MyWebView.gotoUrl(url);
            }
            return url;
        },

        /**
         * 判断一个对象是否为空
         * 只用于判断对象、字符串等，不能用于数字，因为数字0会被误判
         * true - 为空；
         */
        empty: function(obj) {
            if (!obj || obj == "" || obj == '--') {
                return true;
            } else if (typeof obj === "object") {
                for (var prop in obj) {
                    return false;
                }
                return true;
            }
            return false;
        },

        /**
         * 判断是否为移动设备，包括手机、pad
         */
        isMobile: function() {
            return (!!ua.match(/AppleWebKit.*Mobile.*/));
        },

        /**
         * 判断是否为android平台
         */
        isAndroid: function() {
            return (appVersion.indexOf("android") > 0);
        },

        /**
         * 判断是否为iOS平台
         */
        isIOS: function() {
            return (appVersion.indexOf("iphone") > 0 || appVersion.indexOf("ipad") > 0);
        },

        /**
         * [isIOS10 判断是否为IOS 10]
         */
        isIOS10: function() {
            var ver = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
            if (ver && parseInt(ver[1], 10) >= 10){                
                return true;
            }
            return false;
        },

        /**
         * 解决 iOS10 上由于 webkit 内核删除了 document.height 属性，导致native读取不到页面高度
         */
        setHeight: function(h) {
            if (this.isIOS10()) {
                document.height = h;
                
            }
        },

        /**
         * 判断是否为Windows Phone平台
         */
        isWP: function() {
            return (appVersion.indexOf("windows phone") > 0);
        },

        /**
         * 判断是否为iphone
         */
        isIPhone: function() {
            return (appVersion.indexOf("iphone") > 0);
        },

        /**
         * 判断是否是iphonex
         */
        isIphoneX:function(){
            if(this.isIOS()){
                var height=window.screen.height;
                if(height==812){
                    // ios 系统高度为812 则认为是iphoneX
                    return true
                }
            }
        },

        /**
         * 判断是否为ipad
         */
        isIPad: function() {
            return (appVersion.indexOf("ipad") > 0);
        },

        /**
         * 判断是否为wechat
         */
        isWeChat: function() {
            return (!!ua.match(/MicroMessenger/i));
        },

        /**
         * 判断是否为weibo
         */
        isWeibo: function() {
            return (!!ua.match(/WeiBo/i));
        },

        /**
         * 判断是否为qq
         */
        isQQ: function() {
            return (!!ua.match(/QQ/i));
        },

        /**
         *   获取IOS的版本号，比如5.1, 9.2这种
         * 如果参数mainVersion为true,则返回5, 9这种
         * 一般和 isIOS() 函数配合使用。
         *
         *  注：如果不是IOS系统，则返回null
         */
        getIOSVersion: function(mainVersion) {
            //iPhone pattern
            var regExp1 = /iphone os \d+_?\d*_?\d* /,
                //iPad
                regExp2 = /cpu os \d+_?\d*_?\d* /;

            var result = ua.toLowerCase().match(regExp1) || ua.toLowerCase().match(regExp2);
            if (result) {
                result = result[0].split(' ')[2]; // .replace(/_/g,'.');
                if (typeof mainVersion == 'boolean' && mainVersion) {
                    result = result.split('_')[0];
                }
            }
            return result;
        },

        /**
         * 把版本号转为数字，便于比较
         * 计算方法：主版本差1计10000，次版本差1计100，小版本差1计1
         * 比如：3.0.2 计算为： 3 * 10000 + 0 * 100 + 2 = 30002
         * @param version 版本号字符串
         */
        versionValue: function(version) {
            if (this.empty(version) || typeof version !== "string" || version.indexOf(".") <= 0) {
                return null;
            }
            var array = version.split(".");
            if (this.empty(array)) {
                return null;
            }

            var mainVersion = (this.empty(array[0]) ? 0 : parseInt(array[0])),
                midVersion = (this.empty(array[1]) ? 0 : parseInt(array[1])),
                microVersion = (this.empty(array[2]) ? 0 : parseInt(array[2]));
            if (mainVersion < 0 || midVersion < 0 || microVersion < 0) {
                return null;
            }
            return (mainVersion * 10000 + midVersion * 100 + microVersion * 1);
        },

        /**
         * 版本比较
         * @param ver1 版本号字符串，如 3.0.2
         * @param ver2 版本号字符串，如 3.0.3
         * @return >0 ver1比ver2新，=0 两版本一样，<0 ver1比ver2老
         */
        versionCompare: function(ver1, ver2) {
            if (this.empty(ver1) || this.empty(ver2) || typeof ver1 !== "string" || typeof ver2 !== "string" || ver1.indexOf(".") <= 0 || ver2.indexOf(".") <= 0 || this.versionValue(ver1) === null || this.versionValue(ver2) === null || this.versionValue(ver1) <= 0 || this.versionValue(ver2) <= 0) {
                return null;
            }
            return this.versionValue(ver1) - this.versionValue(ver2); // 版本差值
        },

        getUrlParameter: function(paramName) {
            var reg = new RegExp("(^|&)" + paramName + "=([^&]*)(&|$)", "i"),
                arr = window.location.search.substr(1).match(reg);
            if (arr) {
                return arr[2];
            }
            return null;
        },

        /**
         * 格式化金额
         * 比如：formatMoney("138000.245") 或 formatMoney(138000.245) = "138,000.25"
         * @param money 金额数值或字符串
         * @param digits 小数位数，默认是 2位小数
         * @param seperator 分隔符，默认是","
         * @return 格式化后的字符串，如："123,001.23"
         */
        formatMoney: function(money, digits, seperator) {
            if (!money) {
                return 0;
            }
            if (digits !== null && typeof digits !== "undefined") {
                digits = (digits >= 0 && digits <= 20) ? digits : 2;
            } else {
                digits = 2;
            }

            seperator = (seperator && typeof seperator === "string") ? seperator : ",";
            var originStr = parseFloat((money + "").replace(/[^\d\.-]/g, "")).toFixed(digits) + "",
                intArray = originStr.split(".")[0].split("").reverse(),
                digitPart = originStr.split(".")[1],
                temp = "",
                ret = "";
            for (var i = 0; i < intArray.length; i++) {
                temp += intArray[i];
                if ((i + 1) % 3 == 0 && (i + 1) != intArray.length) {
                    temp += seperator;
                }
            }
            ret = temp.split("").reverse().join("");
            if (digits > 0) {
                ret = ret + "." + digitPart;
            }
            return ret;
            
        },

        /**
         * 日期格式化(年月日)，将 20150315 格式化为 2015-03-15
         * @param dateStr
         * @param seperator 分隔符，默认是 "-"
         * @return 格式化后的字符串，若输入日期过长或过短，则返回null
         */
        formatDate: function(dateStr, seperator) {
            if (this.empty(dateStr)) {
                return null;
            }
            if (this.empty(seperator)) {
                seperator = "-";
            }
            var formatStr = null,
                len = dateStr.length;
            if (len <= 0 || len > 8) {
                this.log("日期长度有误，过长或过短.");
            } else {
                formatStr = dateStr.substr(0, 4);
                if (len > 4) {
                    formatStr += (seperator + dateStr.substr(4, 2));
                    if (len > 6) {
                        formatStr += (seperator + dateStr.substr(6, 2));
                    }
                }
            }
            return formatStr;
        },
        /**
         * 处理数据 加单位
         * @param val  数据
         * @param digit  保留小数位数 非必须   不传默认 不处理数据
         * @return 加单位 万  亿
         */
        formatUnitNum:function(val,digit){
            if (this.empty(val)) {
                return null;
            }
            var val_num = parseInt(val),
                val_len = '',
                val_digit = digit && !this.empty(digit) ? digit : '-1';
            if(typeof(val) == 'string'){
                val_len = val.indexOf('-') < 0 ? val.length : val.length-1;
            }else{
                val_len = Math.abs(val);
            }
            if(val_len > 4 && val_len < 9){
                var val_wan = val_num/10000;
                val = val_digit == '-1' ? val_wan : val_wan.toFixed(digit);
                return val+'万';
            }else if(val_len >= 9){
                var val_yi = val_num/100000000;
                val = val_digit == '-1' ? val_yi : val_yi.toFixed(digit);
                return val+'亿';
            }
            return val;
        },
        /**
         * 时间格式化(时分秒)，返回081230 这样的6位字符串。不足6位，前面补0
         * @param time 时间串，如 81230
         * @return 格式化后的6位时间串，如 081230
         */
        formatTime: function(time) {
            if (this.empty(time)) {
                return null;
            }
            var formatStr = "00000" + time,
                len = formatStr.length;
            return formatStr.substr(len - 6, 6);
        },

        /**
         * 获取一个浮点数的小数部分的位数，如 1234.56 ，返回 2
         * @param number 数
         * @return 小数的位数
         */
        digits: function(number) {
            var digits = 0,
                numStr = number.toString();
            if (numStr.indexOf('.') >= 0) {
                digits = numStr.split('.')[1].length;
            }
            return digits;
        },

        /**
         * 数学运算，比如：
         * base.calulate("1023", 24.5, "-")
         * @param v1 左值
         * @param v2 右值
         * @param operator 运算符，支持"+","-","*","/","add","minus","multi","divide", 默认不传时为加法
         * @return 浮点数
         */
        calculate: function(v1, v2, operator) {
            if (typeof v1 === "undefined" || v1 === null || typeof v2 === "undefined" || v2 === null) {
                this.log("输入参数不合法");
                return null;
            }
            if (!operator) {
                operator = "+";
            }
            var digits1 = this.digits(v1),
                digits2 = this.digits(v2),
                len = Math.max(digits1, digits2),
                big1 = v1 * Math.pow(10, len),
                big2 = v2 * Math.pow(10, len),
                val = null;
            switch (operator.toString().toLowerCase()) {
                case "-":
                case "minus":
                    val = (Number(big1) - Number(big2)) / Math.pow(10, len);
                    break;
                case "*":
                case "multi":
                    //解决浮点数*错误问题 如0.0003*10000 正常应该是3 实际是2.9999996
                    val = (Number(v1.toString().replace(".","")) * Number(v2.toString().replace(".",""))) / Math.pow(10, digits1+digits2);
                    break;
                case "/":
                case "div":
                case "divide":
                    val = (Number(big1) / Number(big2));
                    break;
                case "add":
                default:
                    val = (Number(big1) + Number(big2)) / Math.pow(10, len);
                    break;
            }
            return val;
        },

        /**
         * 点击事件绑定，按钮被点击后，自动进入冷却状态
         * 可以在css代码中，给按钮设置冷却后的样式，如：
         * input:disabled, button:disabled { 
         *     background-color: black; 
         * }
         * @param element 用jQuery选中的对象，如 $("#button")
         * @param event 按钮上要绑定的事件
         * @param duration 冷却时间，默认是3秒，可不传
         */
        smartClick: function(element, event, duration) {
            if (this.empty(duration)) {
                duration = 3;
            }
            if (element && element instanceof jQuery) {
                var enable = true;
                element.on("click", function() {
                    if (enable) {
                        enable = false;
                        event && event();

                        element.attr("disabled", true);
                        setTimeout(function() {
                            element.removeAttr("disabled");
                            enable = true;
                        }, duration * 1000);
                    }
                });
            }
        },

        /**
         * 返回APP下载链接
         * iOS && WeChat 时，返回一个链接；其它情况返回另一个链接
         */
        getAPPDownloadURL: function() {
            if (this.isIOS() && this.isWeChat()) {
                return APP_DOWNLOAD_URL_IOS_WX;
            }
            return APP_DOWNLOAD_URL;
        },
        /**
         *返回风险测评链接
         *way 跳转方式 直接传  
         *直接跳转方式 ==>1
         *10061方式    ==>2 
         *1964方式1    ==>3 关闭当前页面，不新开容器
         *1964方式2    ==>4 关闭当前页面，新开容器
         *1965方式     ==>5 关闭当前容器，新开容器
         *from 调用风险测评模块标志 可选
         */
        getRiskURL:function(way,from){
            var risk_url = '',
                append_url = '&&secondtype=99&&secondtext=在线客服&&secondurl=http://action:10320/?kfparam=2|0',
                url = '';
            if (!from) {
                risk_url = '/zlcftajax/add-business/risk-assessment/risk-assessment-start.htm';
            } else {
                risk_url = '/zlcftajax/add-business/risk-assessment/risk-assessment-start.htm?comefrom='+way;
            }
            if(!way){
                url =  'http://action:10061/?fullscreen=1&&url=' + risk_url + append_url;
            }else{
                if (way == 1) {
                    url = risk_url;
                } else if (way == 2) {
                    url = 'http://action:10061/?fullscreen=1&&url=' + risk_url + append_url;
                } else if (way == 3) {
                    url = 'http://action:1964/?url=' + risk_url;
                } else if (way == 4) {
                    url = 'http://action:1964/?url=' + encodeURIComponent('http://action:10061/?fullscreen=1&&url=' + risk_url + append_url);
                } else if (way == 5) {
                    url = 'http://action:1965/?url=' + encodeURIComponent('http://action:10061/?fullscreen=1&&url=' + risk_url + append_url);
                } else {
                    url = 'http://action:10061/?fullscreen=1&&url=' + risk_url + append_url;
                }
            }
            return url;
        },
        /**
         * 判断一个数值的盈亏平状态
         * @return 
         *   盈：gain 如 0.2, +1.3% +.1%
         *   亏: loss 如 -0.2 -1.3%
         *   平：flat 如 0.0  --
         */
        earning: function(value) {
            var result = "flat";
            if (value) {
                if (value.match(/^\-\d+\.?\d+%?$/)) {
                    result = "loss";
                } else if (value.match(/(^(\+\d*|\d+)\.?\d+%?$|^\.\d+%$)/) && value != '0.0') {
                    result = "gain";
                }
            }
            return result;
        },

        /**
         * 判断一个值是否是盈利的
         */
        isGain: function(value) {
            return "gain" === this.earning(value);
        },

        /**
         * 判断一个值是否是亏的
         */
        isLoss: function(value) {
            return "loss" === this.earning(value);
        },

        /**
         * 判断一个值是否是平的，即不盈不亏
         */
        isFlat: function(value) {
            return "flat" === this.earning(value);
        },

        /**
         * 因为js原生不支持replaceAll，提供了一个类似java中replaceAll的功能
         * 匹配后，把所有的reg替换成target
         * @param source 源字符串
         * @param reg 要替换的模式
         * @param target 默认为空串，即 ""
         * @return 替换后的串 
         */
        replaceAll: function(source, reg, target) {
            if (this.empty(source) || this.empty(reg)) {
                this.log("输入的原字符串和匹配模式reg不能为空");
                return null;
            }
            if (this.empty(target)) {
                target = "";
            }
            return source.split(reg).join(target);
        },
        /**
         * 测试移动设备是否支持0.5px线
         */
        checkVersion:function(){
            if (window.devicePixelRatio && devicePixelRatio >= 2) {
                var testElem = document.createElement('div');
                testElem.style.border = '.5px solid transparent';
                document.body.appendChild(testElem);
                if (testElem.offsetHeight == 1)
                {
                    document.body.removeChild(testElem);
                    return true;
                }
                document.body.removeChild(testElem);
                return false;
            }
        },
        /**
         * [stockFilter 过滤ios下的stock或者hkstock]
         * @param  {[type]} str [传入的字符串及url]
         * @return {[type]}     [返回处理后的股票链接]
         */
        stockURL:function(str){
            if(this.isIOS()){
                str = str.replace(/(http[s]?\:\/\/)(hk)?stock\:/gi,"$2stock:")
            }
            return str;
        },
		/**
         * [stockFilter 过滤ios下的stock或者hkstock]
         * [新增版本判断为了解决重码问题 低于5.0.7版本返回http://stock:601688 5.0.7版本及以上返回http://action:12061?stockcode=XXX&&marketcode=XXX]
         * @param  {[type]} str [传入的字符串及url]
         * @param  {[type]} stockCode [股票代码如果没法获取就传空:""]
         * @param  {[type]} marketCode [市场类型如果没法获取就传空:""]
         * @param  {[type]} callback [回调函数返回处理后的股票链接]
         */
        stockURLAsync:function(str,stockCode,marketCode,callback){
            var _this = this;
            _this.isAccessVersion('5.0.8',function(allowed){
                if(!allowed) {//低于5.0.7版本链接形式http://stock:601688
                    if(_this.isIOS()){
                        str = str.replace(/(http[s]?\:\/\/)(hk)?stock\:/gi,"$2stock:");
                    }
                }else{
                    if(_this.empty(stockCode)){//如果stockCode为空，截取stockCode字符串
                        stockCode = str.replace(/(http[s]?\:\/\/)(hk)?stock\:/gi,"");
                    }
                    str = 'http://action:12061?stockcode='+stockCode+'&&marketcode='+marketCode;
                }
                callback && callback(str);
            })
        },
        /**
         * js动态加载css文件
         */
        loadcssfile:function(filename){
            var fileref = document.createElement('link');
            fileref.setAttribute("rel", "stylesheet");
            fileref.setAttribute("type", "text/css");
            fileref.setAttribute("href", filename);
            document.getElementsByTagName("head")[0].appendChild(fileref);
        },
        //检查二次业务版本支持,当前版本低于version时，返回false;否则返回true。
        isAccessVersion: function(version,callback){
            try{
                var xhr = new XMLHttpRequest(),
                    that = this;
                if(!xhr){
                    xhr = new ActiveXObject("Microsoft.XMLHTTP");
                }
                xhr.open('GET','/reqlocal?upversion=',true);
                xhr.send(null);
                xhr.onreadystatechange = function(){
                    if(xhr.readyState==4 && xhr.status==200){
                        var lVersion = JSON.parse(xhr.responseText).UPVERSION,
                            result = that.versionCompare(lVersion,version);
                        if(callback){
                            if(result >= 0){
                                callback(true);
                            }else{
                                callback(false);
                            }
                        }
                    }
                }
            }
            catch(e){
                callback && callback(null);
            }
        },
        //对于分享增加promotion判断，如果包含。
        addSharePromotion: function(orgURL, callback){
            try{
                var xhr = new XMLHttpRequest(),
                    that = this;
                if(!xhr){
                    xhr = new ActiveXObject("Microsoft.XMLHTTP");
                }
                xhr.open('GET','/reqlocal?employeeid=',true);
                xhr.send(null);
                xhr.onreadystatechange = function(){
                    if(xhr.readyState==4 && xhr.status==200){
                        var promotionStr = JSON.parse(xhr.responseText).EMPLOYEEID;                                           
                        if(promotionStr != null && typeof(promotionStr) != "undefined" &&  promotionStr != "" && promotionStr !="($employeeid)" ){
                            var addPro = "?"                                                     
                            if(orgURL.indexOf("?") != -1) {
                                addPro = "&";
                            } 
                            orgURL = orgURL +  addPro +  "promotion=" + promotionStr; 
                            callback(orgURL);
                        } else {
                            callback(orgURL);
                        }
                    } 
                }
            }
            catch(e){
                callback(orgURL);
            }
        }
    };

    if(base.isIphoneX()){
        var metaEl = document.querySelector('meta[name="viewport"]');
        if(metaEl){
            metaEl.setAttribute("content",'device-width=1.0,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no,target-densitydpi = medium-dpi,viewport-fit=cover')
        }
    }

    exports.base = base;

    /**
     * 兼容AMD和非AMD规范
     */
    if (typeof define === "function" && define.amd) {
        define([], function() {
            return base;
        });
    }
})(window);
